package com.huirui.server.pojo.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;

import java.time.LocalTime;

/**
 * 秒杀活动时间信息DTO
 * 用于接收或返回秒杀活动的时段配置（开始时间、结束时间）
 */
@Data
@Schema(
        name = "SeckillActivityDto",
        description = "秒杀活动时段信息数据传输对象，包含活动的开始时间和结束时间，时间格式必须为24小时制的HH:mm:ss，且结束时间需晚于开始时间",
        example = "{\"startTime\": \"10:00:00\", \"endTime\": \"12:00:00\"}"
)
public class SeckillActivityDto {


    @Schema(description = "秒杀活动ID")
    private Long id;

    @Schema(
            description = "活动开始时间（24小时制，格式：HH:mm:ss，范围：00:00:00-23:59:59，且不能晚于结束时间）",
            requiredMode = Schema.RequiredMode.REQUIRED,
            example = "10:00:00",
            pattern = "HH:mm:ss",
            type = "string"
    )
    @NotBlank(message = "开始时间不能为空")
    @Pattern(regexp = "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)$", message = "开始时间格式错误，必须为HH:mm:ss（24小时制）")
    @JsonFormat(pattern = "HH:mm:ss", shape = JsonFormat.Shape.STRING) // 序列化/反序列化格式指定
    private LocalTime startTime;

    @Schema(
            description = "活动结束时间（24小时制，格式：HH:mm:ss，范围：00:00:00-23:59:59，且必须晚于开始时间）",
            requiredMode = Schema.RequiredMode.REQUIRED,
            example = "12:00:00",
            pattern = "HH:mm:ss",
            type = "string"
    )
    @NotBlank(message = "结束时间不能为空")
    @Pattern(regexp = "^([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)$", message = "结束时间格式错误，必须为HH:mm:ss（24小时制）")
    @JsonFormat(pattern = "HH:mm:ss", shape = JsonFormat.Shape.STRING) // 序列化/反序列化格式指定
    private LocalTime endTime;

    /**
     * 自定义校验：结束时间必须晚于开始时间
     * 注：需配合 @Valid 注解在控制器层触发校验
     */
    @AssertTrue(message = "结束时间必须晚于开始时间")
    public boolean isValidTimeRange() {
        if (startTime == null || endTime == null) {
            return false;
        }
        return endTime.isAfter(startTime);
    }
}